package com.winner.jdk_dynamic_proxy;

import java.lang.reflect.Proxy;

//所谓DynamicProxy是这样一种class：它是在运行时生成的class，在生成它时你必须提供一组interface给它，然后该class就宣称它实现了这些 interface。
//你当然可以把该class的实例当作这些interface中的任何一个来用。当然，这个DynamicProxy其实就是一个Proxy，它不会替你作实质性的工作，
//在生成它的实例时你必须提供一个handler，由它接管实际的工作。
//在使用动态代理类时，我们必须实现InvocationHandler接口

//  Proxy类就是用来创建一个代理对象的类，它提供了很多方法，但是我们最常用的是newProxyInstance方法。这个方法的作用就是创建一个代理类对象，
// 它接收三个参数，我们来看下几个参数的含义
//  ClassLoader loader,:指定当前目标对象使用类加载器,
//  Class<?>[] interfaces,:目标对象实现的接口的类型,使用泛型方式确认类型
//  InvocationHandler h:事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入
public class ProxyFactory {
    public static Object newInstance(Object ob) {
        /**
         * Proxy.newProxyInstance该方法用于为指定类加载器，一组接口，调用处理器MyInvocationHandler生成动态代理类对象
         * 返回被代理类(即UserServiceImpl)的代理对象
         */
        return Proxy.newProxyInstance(ob.getClass().getClassLoader(),
                new Class<?>[]{UserService.class}, new MyInvocationHandler(ob));
    }
}
